

import base64
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad


def encrypt(password: str, secret_key: str) -> str:
    """
    加密数据库密码，使用AES-128-CBC模式

    :param password: 要加密的密码
    :param secret_key: 16位长度的密钥
    :return: 加密后的Base64字符串
    """
    if len(secret_key) != 16:
        return ""  # 密钥必须是16位

    # 转换为字节数组
    orig_data = password.encode('utf-8')
    key = secret_key.encode('utf-8')

    # 创建AES密码器
    cipher = AES.new(key, AES.MODE_CBC, key)  # IV使用密钥的前16位（与Go代码保持一致）

    # PKCS7填充
    padded_data = pad(orig_data, AES.block_size)

    # 加密
    encrypted = cipher.encrypt(padded_data)

    # Base64编码
    return base64.b64encode(encrypted).decode('utf-8')


def decrypt(encrypted_str: str, secret_key: str) -> str:
    """
    解密数据库密码

    :param encrypted_str: 加密后的Base64字符串
    :param secret_key: 16位长度的密钥
    :return: 解密后的密码
    """
    if len(secret_key) != 16:
        return ""  # 密钥必须是16位

    try:
        # Base64解码
        encrypted_data = base64.b64decode(encrypted_str)
        key = secret_key.encode('utf-8')

        # 创建AES解密器
        cipher = AES.new(key, AES.MODE_CBC, key)

        # 解密
        decrypted_data = cipher.decrypt(encrypted_data)

        # 去除PKCS7填充
        # 计算填充长度（最后一个字节的值）
        padding_len = decrypted_data[-1]
        if padding_len < 1 or padding_len > AES.block_size:
            return ""
        decrypted_data = decrypted_data[:-padding_len]

        return decrypted_data.decode('utf-8')
    except:
        return ""


# 破解yearning数据库密码
if __name__ == "__main__":
    #secret_key = "dbcjqheupqjsuwsm"  # 必须是16位长度的密钥
    secret_key = "dbcjqheupqjsuwsm"  # 必须是16位长度的密钥
    password = "root"

    # 加密
    # encrypted = encrypt(password, secret_key)
    # encrypted = "irnsGdK7V5mfIG+HKK9dHdy76ZsylW5qW6osq6fnqkQ="; # TPPUsyzP61AsL1lETd1Z
    encrypted = "Vz/iZPFOp21k+Iahs2C9atoQRrc6SyWkvUgVnLz2DTA="
    encrypted = "TdzmIE1o6kZ0RRVY/uXVsw=="

    # 19	生产环境	华为云_SAAS_GAUSS_MYSQL	124.71.222.199	13306	yearning	Vz/iZPFOp21k+Iahs2C9atoQRrc6SyWkvUgVnLz2DTA=	2	1	3180b629-18f0-441c-878f-887de1eb161d			admin				0	0
    print(f"加密后: {encrypted}")

    # 解密
    decrypted = decrypt(encrypted, secret_key)
    print(f"解密后: {decrypted}")